#include "../HeadFiles/StrSimilar.h"

#include <stdio.h>
#include <string.h>
#include <math.h>

double innerProduct(double a[], double b[])//定义两向量内积
{
    int i;
    double sum = 0;
    for (i = 0; i < 36; i++)     //遍历两个向量，将对应元素相乘并累加
        sum += a[i] * b[i];
    return sum;//返回点积
}

double norm(double a[]) //计算向量模长
{
    int i;
    double sum = 0;
    for (i = 0; i < 36; i++)  //遍历向量，将每个元素平方并累加
        sum += a[i] * a[i];
    return sqrt(sum);//取开方得到模长a
}


void strToVectorize(char str[],double *vector) //将字符串转化为向量
{
    int i, j;
    char charset[] = "abcdefghijklmnopqrstuvwxyz0123456789";    // 定义一个字符集数组，包含所有可能出现在字符串中的字符
    int n = strlen(str);
    for (i = 0; i < 36; i++)//向向量数组初始化
        vector[i] = 0;
    // 遍历字符串，统计每个字符在字符集中出现的频率，并存入数组中
    for (i = 0; i < n; i++) {
        for (j = 0; j < 36; j++) {
            if (str[i] == charset[j]) {
                vector[j]++;
                break;
            }
        }
    }
}

double getStrSimilarity(char* str1,char*str2)
{
    double vector1[36],vector2[36];// 定义为double方面后面的除法运算
    strToVectorize(str1,vector1); // 获得两个字符串对应的向量
    strToVectorize(str2,vector2);
    return innerProduct(vector1, vector2) / (norm(vector1) * norm(vector2));// 余弦相似度公式：a和b的点积除以a和b的模长之积
}